package com.b.controller;

import java.util.List;

import jakarta.annotation.Resource;

import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.b.domain.Video;
import com.b.service.RecommendationService;
import com.b.vo.PageVo;
import com.b.vo.Result;

@RestController
@RequestMapping("/recommend")
public class RecommendationController {
    @Resource
    private RecommendationService recommendationService;

    /**
     * 智能混合推荐视频接口
     * 
     * 推荐算法说明：
     * 1. 当提供videoId时：使用混合推荐算法
     *    - 40% 同分类视频（基于当前视频的相似性）
     *    - 40% 协同过滤推荐（基于用户历史偏好）
     *    - 20% 热门视频（增加多样性）
     *    - 所有结果随机打乱，确保每次返回不同的推荐
     * 
     * 2. 当不提供videoId时：使用纯协同过滤推荐
     *    - 基于用户的历史行为（点赞、投币、观看记录）
     *    - 找到相似用户，推荐他们喜欢的视频
     * 
     * @param userId 用户ID（必填）
     * @param videoId 当前观看的视频ID（可选，用于混合推荐）
     * @param pageNum 页码，默认1
     * @param pageSize 每页大小，默认16
     * @return 分页推荐视频列表
     */
    @GetMapping
    public Result recommend(
            @RequestParam Integer userId, 
            @RequestParam(required = false) Integer videoId,
            @RequestParam(required = false, defaultValue = "1") int pageNum,
            @RequestParam(required = false, defaultValue = "50") int pageSize) {
        try {
            PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize);
            List<Video> recommendedVideos;
            
            // 混合推荐：结合协同过滤和基于视频ID的推荐
            if (videoId != null) {
                // 如果有videoId，使用混合推荐（协同过滤 + 基于视频ID的推荐）
                recommendedVideos = recommendationService.recommendVideosByVideoId(userId, videoId, pageRequest);
            } else {
                // 如果没有videoId，只使用协同过滤推荐
                recommendedVideos = recommendationService.recommendVideos(userId, pageRequest);
            }
            
            // 计算总数（service返回总数）
            int total = recommendedVideos.size();
            
            // 创建分页对象
            PageVo<Video> pageVo = new PageVo<>(pageNum, total, pageSize);
            pageVo.setList(recommendedVideos);
            
            return new Result().setCode("200").setMsg("推荐成功").setData(pageVo);
        } catch (Exception e) {
            return new Result().setCode("500").setMsg("推荐失败: " + e.getMessage());
        }
    }
    
    /**
     * 热门视频推荐接口
     * 
     * 基于综合热度算法排序：
     * - 播放量权重：1
     * - 点赞数权重：2
     * - 收藏数权重：3
     * - 投币数权重：5
     * 
     * @param pageNum 页码，默认1
     * @param pageSize 每页大小，默认16
     * @return 分页热门视频列表
     */
    @GetMapping("/popular")
    public Result popularVideos(
            @RequestParam(required = false, defaultValue = "1") int pageNum,
            @RequestParam(required = false, defaultValue = "16") int pageSize) {
        try {
            PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize);
            List<Video> popularVideos = recommendationService.getPopularVideos(pageRequest);
            
            int total = popularVideos.size();
            PageVo<Video> pageVo = new PageVo<>(pageNum, total, pageSize);
            pageVo.setList(popularVideos);
            
            return new Result().setCode("200").setMsg("获取热门视频成功").setData(pageVo);
        } catch (Exception e) {
            return new Result().setCode("500").setMsg("获取热门视频失败: " + e.getMessage());
        }
    }
    
    /**
     * 基于分类的视频推荐接口
     * 
     * 按发布时间排序（最新优先），只返回已审核通过的视频
     * 
     * @param categoryId 分类ID（必填）
     * @param pageNum 页码，默认1
     * @param pageSize 每页大小，默认16
     * @return 分页分类视频列表
     */
    @GetMapping("/category")
    public Result categoryVideos(
            @RequestParam Integer categoryId,
            @RequestParam(required = false, defaultValue = "1") int pageNum,
            @RequestParam(required = false, defaultValue = "16") int pageSize) {
        try {
            PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize);
            List<Video> categoryVideos = recommendationService.getVideosByCategory(categoryId, pageRequest);
            
            int total = categoryVideos.size();
            PageVo<Video> pageVo = new PageVo<>(pageNum, total, pageSize);
            pageVo.setList(categoryVideos);
            
            return new Result().setCode("200").setMsg("获取分类视频成功").setData(pageVo);
        } catch (Exception e) {
            return new Result().setCode("500").setMsg("获取分类视频失败: " + e.getMessage());
        }
    }
}